page.tsx 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. import { Button } from "@/components/ui/button"
  2. import { ArrowLeftIcon } from "lucide-react"
  3. import Link from "next/link"
  4. import Navigation from "@/components/navigation"
  5. import Footer from "@/components/footer"
  6. import { ThemeProvider } from "@/components/theme-provider"
  7. import { Metadata } from "next"
  8. export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
  9. const { locale } = await params
  10. const titles = {
  11. en: "Terms of Service - Aiartools | AI-Powered Image Transformation",
  12. zh: "服务条款 - Aiartools | AI驱动的图像变换工具"
  13. }
  14. const descriptions = {
  15. en: "Read our terms of service for using Aiartools. Understand your rights, responsibilities, and our service conditions.",
  16. zh: "阅读我们使用Aiartools的服务条款。了解您的权利、责任和我们的服务条件。"
  17. }
  18. const title = titles[locale as keyof typeof titles] || titles.en
  19. const description = descriptions[locale as keyof typeof descriptions] || descriptions.en
  20. return {
  21. title,
  22. description,
  23. openGraph: {
  24. title,
  25. description,
  26. url: `https://aiartools.com/${locale}/terms`,
  27. siteName: "Aiartools",
  28. locale: locale === 'zh' ? 'zh_CN' : 'en_US',
  29. type: 'website',
  30. },
  31. twitter: {
  32. card: 'summary',
  33. title,
  34. description,
  35. },
  36. alternates: {
  37. canonical: `https://aiartools.com/${locale}/terms`,
  38. languages: {
  39. 'en': 'https://aiartools.com/en/terms',
  40. 'zh': 'https://aiartools.com/zh/terms',
  41. },
  42. },
  43. }
  44. }
  45. interface TermsPageProps {
  46. params: Promise<{ locale: string }>
  47. }
  48. export default async function TermsPage({ params }: TermsPageProps) {
  49. const { locale } = await params
  50. const t = (key: string): string | string[] => {
  51. const translations: Record<string, Record<string, string | string[]>> = {
  52. en: {
  53. backToHome: "Back to Home",
  54. title: "Terms of Service",
  55. lastUpdated: "Last updated: May 2025",
  56. acceptanceTitle: "Acceptance of Terms",
  57. acceptanceText:
  58. 'By accessing and using Aiartools ("Service"), you accept and agree to be bound by the terms and provisions of this agreement. If you do not agree to abide by the above, please do not use this service.',
  59. serviceDescTitle: "Description of Service",
  60. serviceDescText: "Aiartools is an AI-powered image transformation service that allows users to:",
  61. serviceFeatures: [
  62. "Upload images for AI-powered editing and transformation",
  63. "Apply various styles, filters, and modifications using text prompts",
  64. "Download processed images in high resolution",
  65. "Access advanced features through paid subscriptions",
  66. ],
  67. userAccountsTitle: "User Accounts",
  68. accountCreationTitle: "Account Creation",
  69. accountCreationList: [
  70. "You must provide accurate and complete information when creating an account",
  71. "You are responsible for maintaining the confidentiality of your account credentials",
  72. "You must be at least 13 years old to create an account",
  73. "One person or legal entity may maintain no more than one account",
  74. ],
  75. accountRespTitle: "Account Responsibility",
  76. accountRespList: [
  77. "You are responsible for all activities that occur under your account",
  78. "You must notify us immediately of any unauthorized use of your account",
  79. "We reserve the right to suspend or terminate accounts that violate these terms",
  80. ],
  81. acceptableUseTitle: "Acceptable Use",
  82. permittedUsesTitle: "Permitted Uses",
  83. permittedUsesList: [
  84. "Personal and commercial image editing and transformation",
  85. "Creating content for marketing, social media, and creative projects",
  86. "Educational and research purposes",
  87. ],
  88. prohibitedUsesTitle: "Prohibited Uses",
  89. prohibitedUsesIntro: "You may NOT use our service to:",
  90. prohibitedUsesList: [
  91. "Upload or process images containing illegal, harmful, or offensive content",
  92. "Create deepfakes or misleading content without proper disclosure",
  93. "Process images of people without their consent",
  94. "Generate content that violates intellectual property rights",
  95. "Create content for harassment, discrimination, or hate speech",
  96. "Attempt to reverse engineer or copy our AI models",
  97. "Use automated tools to abuse our service or exceed rate limits",
  98. ],
  99. subscriptionTitle: "Subscription Plans and Payments",
  100. freePlanTitle: "Free Plan",
  101. freePlanList: [
  102. "Limited to 5 image generations per month",
  103. "Basic features and keywords only",
  104. "Watermarked exports",
  105. "Standard processing priority",
  106. ],
  107. paidPlansTitle: "Paid Plans",
  108. paidPlansList: [
  109. "Subscriptions are billed monthly or annually",
  110. "Payments are processed securely through third-party providers",
  111. "All fees are non-refundable",
  112. ],
  113. cancellationTitle: "Cancellation and Refunds",
  114. cancellationList: [
  115. "You may cancel your subscription at any time",
  116. "Cancellation takes effect at the end of the current billing period",
  117. "No refunds for partial months or unused features",
  118. ],
  119. intellectualPropertyTitle: "Intellectual Property",
  120. yourContentTitle: "Your Content",
  121. yourContentList: [
  122. "You retain ownership of images you upload to our service",
  123. "You grant us a limited license to process your images for service provision",
  124. "You own the rights to images generated using our service",
  125. "You are responsible for ensuring you have rights to upload and process images",
  126. ],
  127. ourServiceTitle: "Our Service",
  128. ourServiceList: [
  129. "We own all rights to our AI models, algorithms, and service technology",
  130. "Our service is protected by copyright, trademark, and other intellectual property laws",
  131. "You may not copy, modify, or reverse engineer our service",
  132. ],
  133. serviceAvailabilityTitle: "Service Availability and Limitations",
  134. serviceAvailabilityList: [
  135. "We strive for 99.9% uptime but do not guarantee uninterrupted service",
  136. "We may temporarily suspend service for maintenance or updates",
  137. "Processing times may vary based on server load and image complexity",
  138. "We reserve the right to implement usage limits to ensure fair access",
  139. "Some features may be in beta and subject to changes or removal",
  140. ],
  141. privacyDataTitle: "Privacy and Data Protection",
  142. privacyDataText:
  143. "Your privacy is important to us. Our data handling practices are detailed in our Privacy Policy, which forms part of these terms. Key points include:",
  144. privacyDataList: [
  145. "Images are automatically deleted within 24 hours of processing",
  146. "We do not share your images with third parties",
  147. "Personal information is protected according to applicable privacy laws",
  148. "You can request deletion of your data at any time",
  149. ],
  150. disclaimersTitle: "Disclaimers and Limitation of Liability",
  151. disclaimersNotice: "IMPORTANT LEGAL NOTICE:",
  152. disclaimersList: [
  153. 'Our service is provided "as is" without warranties of any kind',
  154. "We do not guarantee the accuracy, quality, or suitability of generated images",
  155. "We are not liable for any damages arising from use of our service",
  156. "Our total liability is limited to the amount you paid for the service",
  157. "You use our service at your own risk",
  158. ],
  159. terminationTitle: "Termination",
  160. terminationText1:
  161. "We may terminate or suspend your account and access to the service at our sole discretion, without prior notice, for conduct that we believe violates these Terms of Service or is harmful to other users, us, or third parties, or for any other reason.",
  162. terminationText2:
  163. "Upon termination, your right to use the service will cease immediately. All provisions of these Terms which by their nature should survive termination shall survive termination.",
  164. changesTitle: "Changes to Terms",
  165. changesText:
  166. "We reserve the right to modify these terms at any time. We will notify users of significant changes via email or through our service. Continued use of the service after changes constitutes acceptance of the new terms.",
  167. governingLawTitle: "Governing Law and Disputes",
  168. governingLawText1:
  169. "These Terms shall be governed by and construed in accordance with the laws of [Your Jurisdiction], without regard to its conflict of law provisions.",
  170. governingLawText2:
  171. "Any disputes arising from these terms or use of our service shall be resolved through binding arbitration in accordance with the rules of [Arbitration Organization].",
  172. contactTitle: "Contact Information",
  173. contactText: "If you have any questions about these Terms of Service, please contact us:",
  174. contactInfo:
  175. "Email: wt@wmcircle.cn\nBusiness Hours: Monday - Friday, 9 AM - 5 PM\nResponse Time: We aim to respond within 24 hours",
  176. },
  177. zh: {
  178. backToHome: "返回首页",
  179. title: "服务条款",
  180. lastUpdated: "最后更新:2025年5月",
  181. acceptanceTitle: "条款接受",
  182. acceptanceText:
  183. '通过访问和使用Aiartools("服务"),您接受并同意受本协议条款和条件的约束。如果您不同意遵守上述条款,请不要使用此服务。',
  184. serviceDescTitle: "服务描述",
  185. serviceDescText: "Aiartools是一个AI驱动的图像变换服务,允许用户:",
  186. serviceFeatures: [
  187. "上传图像进行AI驱动的编辑和变换",
  188. "使用文本提示应用各种风格、滤镜和修改",
  189. "下载高分辨率的处理图像",
  190. "通过付费订阅访问高级功能",
  191. ],
  192. userAccountsTitle: "用户账户",
  193. accountCreationTitle: "账户创建",
  194. accountCreationList: [
  195. "创建账户时必须提供准确和完整的信息",
  196. "您有责任维护账户凭据的机密性",
  197. "您必须年满13岁才能创建账户",
  198. "一个人或法律实体最多只能维护一个账户",
  199. ],
  200. accountRespTitle: "账户责任",
  201. accountRespList: [
  202. "您对在您账户下发生的所有活动负责",
  203. "您必须立即通知我们任何未经授权使用您账户的情况",
  204. "我们保留暂停或终止违反这些条款的账户的权利",
  205. ],
  206. acceptableUseTitle: "可接受使用",
  207. permittedUsesTitle: "允许的使用",
  208. permittedUsesList: ["个人和商业图像编辑和变换", "为营销、社交媒体和创意项目创建内容", "教育和研究目的"],
  209. prohibitedUsesTitle: "禁止的使用",
  210. prohibitedUsesIntro: "您不得使用我们的服务来:",
  211. prohibitedUsesList: [
  212. "上传或处理包含非法、有害或冒犯性内容的图像",
  213. "创建深度伪造或误导性内容而不进行适当披露",
  214. "未经同意处理他人的图像",
  215. "生成违反知识产权的内容",
  216. "创建用于骚扰、歧视或仇恨言论的内容",
  217. "试图逆向工程或复制我们的AI模型",
  218. "使用自动化工具滥用我们的服务或超出速率限制",
  219. ],
  220. subscriptionTitle: "订阅计划和付款",
  221. freePlanTitle: "免费计划",
  222. freePlanList: ["每月限制5次图像生成", "仅限基本功能和关键词", "带水印的导出", "标准处理优先级"],
  223. paidPlansTitle: "付费计划",
  224. paidPlansList: ["订阅按月或年计费", "付款通过第三方提供商安全处理", "所有费用不可退还"],
  225. cancellationTitle: "取消和退款",
  226. cancellationList: [
  227. "您可以随时取消订阅",
  228. "取消在当前计费周期结束时生效",
  229. "初次购买后30天内可获得退款",
  230. "不退还部分月份或未使用功能的费用",
  231. ],
  232. intellectualPropertyTitle: "知识产权",
  233. yourContentTitle: "您的内容",
  234. yourContentList: [
  235. "您保留上传到我们服务的图像的所有权",
  236. "您授予我们有限许可来处理您的图像以提供服务",
  237. "您拥有使用我们服务生成的图像的权利",
  238. "您有责任确保您有权上传和处理图像",
  239. ],
  240. ourServiceTitle: "我们的服务",
  241. ourServiceList: [
  242. "我们拥有AI模型、算法和服务技术的所有权利",
  243. "我们的服务受版权、商标和其他知识产权法保护",
  244. "您不得复制、修改或逆向工程我们的服务",
  245. ],
  246. serviceAvailabilityTitle: "服务可用性和限制",
  247. serviceAvailabilityList: [
  248. "我们努力实现99.9%的正常运行时间,但不保证不间断服务",
  249. "我们可能会因维护或更新而暂时暂停服务",
  250. "处理时间可能因服务器负载和图像复杂性而异",
  251. "我们保留实施使用限制以确保公平访问的权利",
  252. "某些功能可能处于测试阶段,可能会发生变化或删除",
  253. ],
  254. privacyDataTitle: "隐私和数据保护",
  255. privacyDataText:
  256. "您的隐私对我们很重要。我们的数据处理实践在我们的隐私政策中详细说明,该政策构成这些条款的一部分。要点包括:",
  257. privacyDataList: [
  258. "图像在处理后24小时内自动删除",
  259. "我们不与第三方共享您的图像",
  260. "个人信息根据适用的隐私法律受到保护",
  261. "您可以随时请求删除您的数据",
  262. ],
  263. disclaimersTitle: "免责声明和责任限制",
  264. disclaimersNotice: "重要法律声明:",
  265. disclaimersList: [
  266. '我们的服务按"现状"提供,不提供任何形式的保证',
  267. "我们不保证生成图像的准确性、质量或适用性",
  268. "我们不对使用我们服务产生的任何损害承担责任",
  269. "我们的总责任限于您为服务支付的金额",
  270. "您使用我们的服务风险自负",
  271. ],
  272. terminationTitle: "终止",
  273. terminationText1:
  274. "我们可能会自行决定终止或暂停您的账户和对服务的访问,无需事先通知,如果我们认为您的行为违反了这些服务条款或对其他用户、我们或第三方有害,或出于任何其他原因。",
  275. terminationText2:
  276. "终止后,您使用服务的权利将立即停止。这些条款中本质上应在终止后继续有效的所有条款将在终止后继续有效。",
  277. changesTitle: "条款变更",
  278. changesText:
  279. "我们保留随时修改这些条款的权利。我们将通过电子邮件或通过我们的服务通知用户重大变更。变更后继续使用服务即表示接受新条款。",
  280. governingLawTitle: "适用法律和争议",
  281. governingLawText1: "这些条款应受[您的管辖区]法律管辖和解释,不考虑其法律冲突条款。",
  282. governingLawText2: "因这些条款或使用我们服务而产生的任何争议应根据[仲裁组织]的规则通过有约束力的仲裁解决。",
  283. contactTitle: "联系信息",
  284. contactText: "如果您对这些服务条款有任何疑问,请联系我们:",
  285. contactInfo:
  286. "电子邮件:wt@wmcircle.cn\n营业时间:周一至周五,上午9点至下午5点\n响应时间:我们力争在24小时内回复",
  287. },
  288. }
  289. return translations[locale]?.[key] || translations.en[key]
  290. }
  291. // 类型保护函数
  292. const getArrayFromTranslation = (key: string): string[] => {
  293. const result = t(key);
  294. return Array.isArray(result) ? result : [];
  295. }
  296. return (
  297. <ThemeProvider attribute="class" defaultTheme="light" enableSystem disableTransitionOnChange>
  298. <div className="min-h-screen bg-background">
  299. <Navigation locale={locale} />
  300. <div className="pt-20">
  301. <div className="container mx-auto px-4 sm:px-6 lg:px-8 py-12">
  302. <div className="max-w-4xl mx-auto">
  303. {/* Header */}
  304. <div className="mb-8">
  305. <Link href={`/${locale}`}>
  306. <Button variant="ghost" className="mb-4">
  307. <ArrowLeftIcon className="w-4 h-4 mr-2" />
  308. {t("backToHome")}
  309. </Button>
  310. </Link>
  311. <h1 className="text-4xl font-bold mb-4">{t("title")}</h1>
  312. <p className="text-muted-foreground">{t("lastUpdated")}</p>
  313. </div>
  314. {/* Content */}
  315. <div className="prose prose-gray dark:prose-invert max-w-none space-y-8">
  316. <section>
  317. <h2 className="text-2xl font-semibold mb-4">1. {t("acceptanceTitle")}</h2>
  318. <p className="text-muted-foreground leading-relaxed">{t("acceptanceText")}</p>
  319. </section>
  320. <section>
  321. <h2 className="text-2xl font-semibold mb-4">2. {t("serviceDescTitle")}</h2>
  322. <p className="text-muted-foreground mb-4">{t("serviceDescText")}</p>
  323. <ul className="list-disc list-inside text-muted-foreground space-y-2">
  324. {getArrayFromTranslation("serviceFeatures").map((item: string, index: number) => (
  325. <li key={index}>{item}</li>
  326. ))}
  327. </ul>
  328. </section>
  329. <section>
  330. <h2 className="text-2xl font-semibold mb-4">3. {t("userAccountsTitle")}</h2>
  331. <div className="space-y-4">
  332. <div>
  333. <h3 className="text-lg font-medium mb-2">3.1 {t("accountCreationTitle")}</h3>
  334. <ul className="list-disc list-inside text-muted-foreground space-y-1">
  335. {getArrayFromTranslation("accountCreationList").map((item: string, index: number) => (
  336. <li key={index}>{item}</li>
  337. ))}
  338. </ul>
  339. </div>
  340. <div>
  341. <h3 className="text-lg font-medium mb-2">3.2 {t("accountRespTitle")}</h3>
  342. <ul className="list-disc list-inside text-muted-foreground space-y-1">
  343. {getArrayFromTranslation("accountRespList").map((item: string, index: number) => (
  344. <li key={index}>{item}</li>
  345. ))}
  346. </ul>
  347. </div>
  348. </div>
  349. </section>
  350. <section>
  351. <h2 className="text-2xl font-semibold mb-4">4. {t("acceptableUseTitle")}</h2>
  352. <div className="space-y-4">
  353. <div>
  354. <h3 className="text-lg font-medium mb-2">4.1 {t("permittedUsesTitle")}</h3>
  355. <ul className="list-disc list-inside text-muted-foreground space-y-1">
  356. {getArrayFromTranslation("permittedUsesList").map((item: string, index: number) => (
  357. <li key={index}>{item}</li>
  358. ))}
  359. </ul>
  360. </div>
  361. <div>
  362. <h3 className="text-lg font-medium mb-2">4.2 {t("prohibitedUsesTitle")}</h3>
  363. <div className="bg-red-50 dark:bg-red-900/20 p-4 rounded-lg">
  364. <p className="text-red-800 dark:text-red-200 font-medium mb-2">{t("prohibitedUsesIntro")}</p>
  365. <ul className="list-disc list-inside text-red-700 dark:text-red-300 space-y-1">
  366. {getArrayFromTranslation("prohibitedUsesList").map((item: string, index: number) => (
  367. <li key={index}>{item}</li>
  368. ))}
  369. </ul>
  370. </div>
  371. </div>
  372. </div>
  373. </section>
  374. <section>
  375. <h2 className="text-2xl font-semibold mb-4">5. {t("subscriptionTitle")}</h2>
  376. <div className="space-y-4">
  377. <div>
  378. <h3 className="text-lg font-medium mb-2">5.1 {t("freePlanTitle")}</h3>
  379. <ul className="list-disc list-inside text-muted-foreground space-y-1">
  380. {getArrayFromTranslation("freePlanList").map((item: string, index: number) => (
  381. <li key={index}>{item}</li>
  382. ))}
  383. </ul>
  384. </div>
  385. <div>
  386. <h3 className="text-lg font-medium mb-2">5.2 {t("paidPlansTitle")}</h3>
  387. <ul className="list-disc list-inside text-muted-foreground space-y-1">
  388. {getArrayFromTranslation("paidPlansList").map((item: string, index: number) => (
  389. <li key={index}>{item}</li>
  390. ))}
  391. </ul>
  392. </div>
  393. <div>
  394. <h3 className="text-lg font-medium mb-2">5.3 {t("cancellationTitle")}</h3>
  395. <ul className="list-disc list-inside text-muted-foreground space-y-1">
  396. {getArrayFromTranslation("cancellationList").map((item: string, index: number) => (
  397. <li key={index}>{item}</li>
  398. ))}
  399. </ul>
  400. </div>
  401. </div>
  402. </section>
  403. <section>
  404. <h2 className="text-2xl font-semibold mb-4">6. {t("intellectualPropertyTitle")}</h2>
  405. <div className="space-y-4">
  406. <div>
  407. <h3 className="text-lg font-medium mb-2">6.1 {t("yourContentTitle")}</h3>
  408. <ul className="list-disc list-inside text-muted-foreground space-y-1">
  409. {getArrayFromTranslation("yourContentList").map((item: string, index: number) => (
  410. <li key={index}>{item}</li>
  411. ))}
  412. </ul>
  413. </div>
  414. <div>
  415. <h3 className="text-lg font-medium mb-2">6.2 {t("ourServiceTitle")}</h3>
  416. <ul className="list-disc list-inside text-muted-foreground space-y-1">
  417. {getArrayFromTranslation("ourServiceList").map((item: string, index: number) => (
  418. <li key={index}>{item}</li>
  419. ))}
  420. </ul>
  421. </div>
  422. </div>
  423. </section>
  424. <section>
  425. <h2 className="text-2xl font-semibold mb-4">7. {t("serviceAvailabilityTitle")}</h2>
  426. <ul className="list-disc list-inside text-muted-foreground space-y-2">
  427. {getArrayFromTranslation("serviceAvailabilityList").map((item: string, index: number) => (
  428. <li key={index}>{item}</li>
  429. ))}
  430. </ul>
  431. </section>
  432. <section>
  433. <h2 className="text-2xl font-semibold mb-4">8. {t("privacyDataTitle")}</h2>
  434. <p className="text-muted-foreground mb-4">{t("privacyDataText")}</p>
  435. <ul className="list-disc list-inside text-muted-foreground space-y-2">
  436. {getArrayFromTranslation("privacyDataList").map((item: string, index: number) => (
  437. <li key={index}>{item}</li>
  438. ))}
  439. </ul>
  440. </section>
  441. <section>
  442. <h2 className="text-2xl font-semibold mb-4">9. {t("disclaimersTitle")}</h2>
  443. <div className="bg-yellow-50 dark:bg-yellow-900/20 p-4 rounded-lg">
  444. <p className="text-yellow-800 dark:text-yellow-200 mb-4">
  445. <strong>{t("disclaimersNotice")}</strong>
  446. </p>
  447. <ul className="list-disc list-inside text-yellow-700 dark:text-yellow-300 space-y-2">
  448. {getArrayFromTranslation("disclaimersList").map((item: string, index: number) => (
  449. <li key={index}>{item}</li>
  450. ))}
  451. </ul>
  452. </div>
  453. </section>
  454. <section>
  455. <h2 className="text-2xl font-semibold mb-4">10. {t("terminationTitle")}</h2>
  456. <p className="text-muted-foreground mb-4">{t("terminationText1")}</p>
  457. <p className="text-muted-foreground">{t("terminationText2")}</p>
  458. </section>
  459. <section>
  460. <h2 className="text-2xl font-semibold mb-4">11. {t("changesTitle")}</h2>
  461. <p className="text-muted-foreground">{t("changesText")}</p>
  462. </section>
  463. <section>
  464. <h2 className="text-2xl font-semibold mb-4">12. {t("governingLawTitle")}</h2>
  465. <p className="text-muted-foreground mb-4">{t("governingLawText1")}</p>
  466. <p className="text-muted-foreground">{t("governingLawText2")}</p>
  467. </section>
  468. <section>
  469. <h2 className="text-2xl font-semibold mb-4">13. {t("contactTitle")}</h2>
  470. <p className="text-muted-foreground mb-4">{t("contactText")}</p>
  471. <div className="bg-muted/30 p-4 rounded-lg">
  472. <p className="text-muted-foreground whitespace-pre-line">{t("contactInfo")}</p>
  473. </div>
  474. </section>
  475. </div>
  476. </div>
  477. </div>
  478. </div>
  479. <Footer locale={locale} />
  480. </div>
  481. </ThemeProvider>
  482. )
  483. }